/*-------------------------------------------------------------------------
 *
 * functions.h
 *		SQL语言函数执行的声明。
 *
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/executor/functions.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include "nodes/execnodes.h"
#include "tcop/dest.h"

/*
 * 解析器回调钩子所需的数据结构，用于在解析 SQL 函数主体时解析参数引用。
 * 这与 SQLFunctionCache 是分开的，因为我们有时会单独进行解析和执行。
 */
typedef struct SQLFunctionParseInfo
{
	char	   *fname;			/* 函数名称 */
	int			nargs;			/* 输入参数的数量 */
	Oid		   *argtypes;		/* 输入参数的解析类型 */
	char	  **argnames;		/* 输入参数的名称；如果没有则为 NULL */
	/* 注意，如果某些参数没有名称，则 argnames[i] 可以为 NULL */
	Oid			collation;		/* 函数的输入排序规则（如果已知） */
} SQLFunctionParseInfo;

typedef SQLFunctionParseInfo *SQLFunctionParseInfoPtr;

extern Datum fmgr_sql(PG_FUNCTION_ARGS);

extern SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple,
														 Node *call_expr,
														 Oid inputCollation);

extern void sql_fn_parser_setup(struct ParseState *pstate,
								SQLFunctionParseInfoPtr pinfo);

extern void check_sql_fn_statements(List *queryTreeLists);

extern bool check_sql_fn_retval(List *queryTreeLists,
								Oid rettype, TupleDesc rettupdesc,
								bool insertDroppedCols,
								List **resultTargetList);

extern bool check_sql_fn_retval_ext(List *queryTreeLists,
									Oid rettype, TupleDesc rettupdesc,
									char prokind,
									bool insertDroppedCols,
									List **resultTargetList);

extern DestReceiver *CreateSQLFunctionDestReceiver(void);

#endif							/* FUNCTIONS_H */
